This is the code I used to render the following video.

Data compiled by David Lazar (@davidthelazar) and available here. The version used to create the following video is here.

Notes from twitter:

library(tidyverse)
library(gganimate)
library(transformr)

input <- read.csv("~/Desktop/blaseball/20210723_idolBoardData-rawData.csv") 

input %>% 
  select(-c(3:22)) %>% 
  pivot_longer(cols = 3:22,
               names_to = "position",
               values_to = "player") %>% 
  mutate(position = str_remove(position, "X"),
         position = str_remove(position, fixed(".1"))) %>% 
  full_join(input %>%
              select(1:22) %>% 
              pivot_longer(cols = 3:22,
                           names_to = "position",
                           values_to = "eDensity") %>% 
              mutate(position = str_remove(position, "X")),
            by = c("timestamp", "strictlyConfidential", "position")) %>% 
  mutate(position = as.integer(position),
         timestamp = str_trunc(timestamp, 
                               width = 19, 
                               side = "right", 
                               ellipsis = ""),
         timestamp = str_replace(timestamp, pattern = "T",replacement = " "),
         timestamp = strftime(timestamp,
                              format = "%F %T"),
         timestampPOSIX = strptime(timestamp,
                                   format = "%F %T")) %>% 
  rename(noodle = strictlyConfidential) -> idols

First, I created the static image from which the frames will be extracted.

idols %>% 
  # These filters are good for testing how it responds to y-axis changes and x-axis dimensions
  #filter(timestampPOSIX > strptime("2021-06-25 02:00:01", format = "%F %T") &
  #         timestampPOSIX < strptime("2021-06-29 02:00:01", format = "%F %T")) %>% 
  mutate(timestamp_fct = as.factor(timestamp),
         position_fct = as.factor(position)) %>% 
  group_by(timestampPOSIX) %>% 
  summarise(total = sum(eDensity)) %>% 
  full_join(idols %>% 
              # Same as above.
              #filter(timestampPOSIX > strptime("2021-06-25 02:00:01", format = "%F %T") &
              #         timestampPOSIX < strptime("2021-06-29 02:00:01", format = "%F %T")) %>%
              mutate(timestamp_fct = as.factor(timestamp),
                     position_fct = as.factor(position)),
            by = "timestampPOSIX") %>% 
  # Just to keep the names consistent across all timepoints
  mutate(player_name = case_when(player == "--at-ema -lem-f-yo" ~ "Anathema Elemefayo",
                                 player == "B-by Do-le" ~ "Baby Doyle",
                                 player == "Com-issioner V-por" ~ "Commissioner Vapor",
                                 player == "Commissioner V-por" ~ "Commissioner Vapor",
                                 player == "-o- Mit-hel-" ~ "Don Mitchell",
                                 player == "-o- Mitchel-" ~ "Don Mitchell",
                                 player == "-o- Mitchell" ~ "Don Mitchell",
                                 player == "-on Mitchell" ~ "Don Mitchell",
                                 player == "-ud-ey -ueller" ~ "Dudley Mueller",
                                 player == "-ud-ey Mueller" ~ "Dudley Mueller",
                                 player == "Dud-ey Mueller" ~ "Dudley Mueller",
                                 player == "Dudley Muelle-" ~ "Dudley Mueller",
                                 player == "Dud-ey Mueller" ~ "Dudley Mueller",
                                 player == "Dudley Muelle-" ~ "Dudley Mueller",
                                 player == "G-a Holb---k" ~ "Gia Holbrook",
                                 player == "G-a Holb--ok" ~ "Gia Holbrook",
                                 player == "G-a Holbr-ok" ~ "Gia Holbrook",
                                 player == "H-t-ie-d S-z-ki" ~ "Hatfield Suzuki",
                                 player == "J-xo- B-c--ey" ~ "Jaxon Buckley",
                                 player == "J-xo- B-ck-ey" ~ "Jaxon Buckley",
                                 player == "J-xon B-ck-ey" ~ "Jaxon Buckley",
                                 player == "J-x-n B-ck--y" ~ "Jaxon Buckley",
                                 player == "J-x-n B-ckl-y" ~ "Jaxon Buckley",
                                 player == "J-x-n Buckl-y" ~ "Jaxon Buckley",
                                 player == "J-x-n Buckley" ~ "Jaxon Buckley",
                                 player == "Jax-n Buckley" ~ "Jaxon Buckley",
                                 player == "Jaxon B-ck-ey" ~ "Jaxon Buckley",
                                 player == "Jaxon Buck-ey" ~ "Jaxon Buckley",
                                 player == "Knight Triu-phant" ~ "Knight Triumphant",
                                 player == "Malik Dest-ny" ~ "Malik Destiny",
                                 player == "Mi-a -emma" ~ "Mira Lemma",
                                 player == "Mira -emma" ~ "Mira Lemma",
                                 player == "P-u-a --rn-p" ~ "Paula Turnip",
                                 player == "P-u-a --rnip" ~ "Paula Turnip",
                                 player == "Pau-a -urnip" ~ "Paula Turnip",
                                 player == "Pi-ching -ac--ne" ~ "Pitching Machine",
                                 player == "R-g-- --ie-r---" ~ "Rigby Friedrich",
                                 player == "T-oma- Drac-ena" ~ "Thomas Dracaena",
                                 player == "Thoma- Drac-ena" ~ "Thomas Dracaena",
                                 player == "Thomas Drac-ena" ~ "Thomas Dracaena",
                                 player == "--n--- Carve-" ~ "Sandie Carver",
                                 TRUE ~ player)) %>% 
  group_by(timestampPOSIX, position_fct, player_name) %>% 
  summarise(percent = eDensity/total,
            abs_percent = abs(eDensity)/total) %>% 
  mutate(log_percent = case_when(abs_percent == 0 ~ 0,
                                 abs_percent > 0 ~ log(abs_percent)+6),
         player_position = paste0(" ", as.character(position_fct), ": ", player_name)) %>% 
  # Plot begins here
  ggplot(aes(x = timestampPOSIX, 
             y = percent,
             colour = position_fct)) +
  theme_bw() +
  viridis::scale_fill_viridis(option = "plasma", discrete = TRUE) +
  viridis::scale_colour_viridis(option = "plasma", discrete = TRUE) +
  scale_y_continuous(labels = scales::percent_format()) +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1),
        legend.position = "none") +
  # Layer 1 (for animation)
  geom_point(aes(#group = player_position,
                 size = percent),
             position = "stack",
             stat = "identity",
             alpha = .5) +
  # Layer 2 (to be excluded from animation's shadow/trace)
  geom_text(aes(label = player_position,
                size = log_percent),
            stat = "identity",
            position = "stack",
            check_overlap = FALSE, 
            hjust = 0) +
  ggtitle("") -> q

Next, animate the plot, which will initially compile as a gif, but only with 100 frames (for now).

q + transition_states(timestampPOSIX,
                      transition_length = 10,
                      state_length = 1) +
  ease_aes("cubic-in") +
  view_follow(fixed_x = TRUE) +
  labs(title = 'Idol Board at {closest_state}') + 
  shadow_trail(distance = 1,
               exclude_layer = 2) + 
  shadow_mark(alpha = .05,
              exclude_layer = 2) +
  enter_fade() + exit_fade() -> q1

Finally, render it as a video and save it (although I still needed to convert to .m4v using VLC and then transcode to .mp4 using HandBrake).

animate(q1, 
        nframes = 6000,
        fps = 30,
        renderer = av_renderer(),
        detail = 3,
        width = 1920,
        height = 1080)
#anim_save("20210725-big_vid")

And, if all goes well, and you have lots of time and sufficient computing power, you get something like this:

LS0tCnRpdGxlOiAiRGF0YWNyaW1lcyBWaXN1YWxpemVkIgphdXRob3I6ICJieSBMYXVyZW4gQWNrZXJtYW4iCmRhdGU6ICIyMDIxIEp1bHkgMjUiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgaXMgdGhlIGNvZGUgSSB1c2VkIHRvIHJlbmRlciB0aGUgZm9sbG93aW5nIHZpZGVvLgoKRGF0YSBjb21waWxlZCBieSBEYXZpZCBMYXphciAoW1xAZGF2aWR0aGVsYXphcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9kYXZpZHRoZWxhemFyKSkgYW5kIGF2YWlsYWJsZSBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMVZmTTJMYW44X0ItdGZEbFNpOHFfaDRKdUllNmZ6cW84cjVJNHlLQU4xTlEvZWRpdCkuIFRoZSB2ZXJzaW9uIHVzZWQgdG8gY3JlYXRlIHRoZSBmb2xsb3dpbmcgdmlkZW8gaXMgW2hlcmVdKDIwMjEwNzIzX2lkb2xCb2FyZERhdGEtcmF3RGF0YS5jc3YpLgoKTm90ZXMgZnJvbSB0d2l0dGVyOiAKCiogc28ganVzdCB0byBkb3VibGUgY2hlY2ssIGNvbHVtbnMgQzpWIGFyZSBlRGVuc2l0aWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBsYXllcnMgaW4gY29sdW1ucyBXOkFQPyBhbmQgc3RyaWN0bHlDb25maWRlbnRpYWwgaXMsIHdoYXQsIHdoZXJlIHRoZSBub29kbGUgd2FzPyAKKiBBbGwgY29ycmVjdC4gQnV0IGp1c3QgdG8gYmUgY2xlYXIsIHRoZSBlRGVuc2l0aWVzIGFuZCBwbGF5ZXIgbmFtZXMgYXJlIGFsd2F5cyBpbiBvcmRlciBmcm9tIHRvcCBvZiBpZG9sYm9hcmQgdG8gdGhlIGJvdHRvbSAobGFiZWxzIGluIHJvdyAxKS4gQWxzbywgc3RyaWN0bHlDb25maWRlbnRpYWwgaXMgemVyby1pbmRleGVkIHNvIHRoZSBub29kbGUgaGFzIHN0cmljdGx5Q29uZmlkZW50aWFsKzEgcGxheWVycyBhYm92ZSBpdAoKCmBgYHtyIHNldHVwLCBldmFsPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShnZ2FuaW1hdGUpCmxpYnJhcnkodHJhbnNmb3JtcikKCmlucHV0IDwtIHJlYWQuY3N2KCJ+L0Rlc2t0b3AvYmxhc2ViYWxsLzIwMjEwNzIzX2lkb2xCb2FyZERhdGEtcmF3RGF0YS5jc3YiKSAKCmlucHV0ICU+JSAKICBzZWxlY3QoLWMoMzoyMikpICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IDM6MjIsCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInBvc2l0aW9uIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBsYXllciIpICU+JSAKICBtdXRhdGUocG9zaXRpb24gPSBzdHJfcmVtb3ZlKHBvc2l0aW9uLCAiWCIpLAogICAgICAgICBwb3NpdGlvbiA9IHN0cl9yZW1vdmUocG9zaXRpb24sIGZpeGVkKCIuMSIpKSkgJT4lIAogIGZ1bGxfam9pbihpbnB1dCAlPiUKICAgICAgICAgICAgICBzZWxlY3QoMToyMikgJT4lIAogICAgICAgICAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gMzoyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAicG9zaXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiZURlbnNpdHkiKSAlPiUgCiAgICAgICAgICAgICAgbXV0YXRlKHBvc2l0aW9uID0gc3RyX3JlbW92ZShwb3NpdGlvbiwgIlgiKSksCiAgICAgICAgICAgIGJ5ID0gYygidGltZXN0YW1wIiwgInN0cmljdGx5Q29uZmlkZW50aWFsIiwgInBvc2l0aW9uIikpICU+JSAKICBtdXRhdGUocG9zaXRpb24gPSBhcy5pbnRlZ2VyKHBvc2l0aW9uKSwKICAgICAgICAgdGltZXN0YW1wID0gc3RyX3RydW5jKHRpbWVzdGFtcCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDE5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGUgPSAicmlnaHQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsbGlwc2lzID0gIiIpLAogICAgICAgICB0aW1lc3RhbXAgPSBzdHJfcmVwbGFjZSh0aW1lc3RhbXAsIHBhdHRlcm4gPSAiVCIscmVwbGFjZW1lbnQgPSAiICIpLAogICAgICAgICB0aW1lc3RhbXAgPSBzdHJmdGltZSh0aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIlRiAlVCIpLAogICAgICAgICB0aW1lc3RhbXBQT1NJWCA9IHN0cnB0aW1lKHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiJUYgJVQiKSkgJT4lIAogIHJlbmFtZShub29kbGUgPSBzdHJpY3RseUNvbmZpZGVudGlhbCkgLT4gaWRvbHMKYGBgCgpGaXJzdCwgSSBjcmVhdGVkIHRoZSBzdGF0aWMgaW1hZ2UgZnJvbSB3aGljaCB0aGUgZnJhbWVzIHdpbGwgYmUgZXh0cmFjdGVkLgoKYGBge3Igc3RhdGljfQppZG9scyAlPiUgCiAgIyBUaGVzZSBmaWx0ZXJzIGFyZSBnb29kIGZvciB0ZXN0aW5nIGhvdyBpdCByZXNwb25kcyB0byB5LWF4aXMgY2hhbmdlcyBhbmQgeC1heGlzIGRpbWVuc2lvbnMKICAjZmlsdGVyKHRpbWVzdGFtcFBPU0lYID4gc3RycHRpbWUoIjIwMjEtMDYtMjUgMDI6MDA6MDEiLCBmb3JtYXQgPSAiJUYgJVQiKSAmCiAgIyAgICAgICAgIHRpbWVzdGFtcFBPU0lYIDwgc3RycHRpbWUoIjIwMjEtMDYtMjkgMDI6MDA6MDEiLCBmb3JtYXQgPSAiJUYgJVQiKSkgJT4lIAogIG11dGF0ZSh0aW1lc3RhbXBfZmN0ID0gYXMuZmFjdG9yKHRpbWVzdGFtcCksCiAgICAgICAgIHBvc2l0aW9uX2ZjdCA9IGFzLmZhY3Rvcihwb3NpdGlvbikpICU+JSAKICBncm91cF9ieSh0aW1lc3RhbXBQT1NJWCkgJT4lIAogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShlRGVuc2l0eSkpICU+JSAKICBmdWxsX2pvaW4oaWRvbHMgJT4lIAogICAgICAgICAgICAgICMgU2FtZSBhcyBhYm92ZS4KICAgICAgICAgICAgICAjZmlsdGVyKHRpbWVzdGFtcFBPU0lYID4gc3RycHRpbWUoIjIwMjEtMDYtMjUgMDI6MDA6MDEiLCBmb3JtYXQgPSAiJUYgJVQiKSAmCiAgICAgICAgICAgICAgIyAgICAgICAgIHRpbWVzdGFtcFBPU0lYIDwgc3RycHRpbWUoIjIwMjEtMDYtMjkgMDI6MDA6MDEiLCBmb3JtYXQgPSAiJUYgJVQiKSkgJT4lCiAgICAgICAgICAgICAgbXV0YXRlKHRpbWVzdGFtcF9mY3QgPSBhcy5mYWN0b3IodGltZXN0YW1wKSwKICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25fZmN0ID0gYXMuZmFjdG9yKHBvc2l0aW9uKSksCiAgICAgICAgICAgIGJ5ID0gInRpbWVzdGFtcFBPU0lYIikgJT4lIAogICMgSnVzdCB0byBrZWVwIHRoZSBuYW1lcyBjb25zaXN0ZW50IGFjcm9zcyBhbGwgdGltZXBvaW50cwogIG11dGF0ZShwbGF5ZXJfbmFtZSA9IGNhc2Vfd2hlbihwbGF5ZXIgPT0gIi0tYXQtZW1hIC1sZW0tZi15byIgfiAiQW5hdGhlbWEgRWxlbWVmYXlvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJCLWJ5IERvLWxlIiB+ICJCYWJ5IERveWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJDb20taXNzaW9uZXIgVi1wb3IiIH4gIkNvbW1pc3Npb25lciBWYXBvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiQ29tbWlzc2lvbmVyIFYtcG9yIiB+ICJDb21taXNzaW9uZXIgVmFwb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIi1vLSBNaXQtaGVsLSIgfiAiRG9uIE1pdGNoZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICItby0gTWl0Y2hlbC0iIH4gIkRvbiBNaXRjaGVsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiLW8tIE1pdGNoZWxsIiB+ICJEb24gTWl0Y2hlbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIi1vbiBNaXRjaGVsbCIgfiAiRG9uIE1pdGNoZWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICItdWQtZXkgLXVlbGxlciIgfiAiRHVkbGV5IE11ZWxsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIi11ZC1leSBNdWVsbGVyIiB+ICJEdWRsZXkgTXVlbGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiRHVkLWV5IE11ZWxsZXIiIH4gIkR1ZGxleSBNdWVsbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJEdWRsZXkgTXVlbGxlLSIgfiAiRHVkbGV5IE11ZWxsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkR1ZC1leSBNdWVsbGVyIiB+ICJEdWRsZXkgTXVlbGxlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiRHVkbGV5IE11ZWxsZS0iIH4gIkR1ZGxleSBNdWVsbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJHLWEgSG9sYi0tLWsiIH4gIkdpYSBIb2xicm9vayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiRy1hIEhvbGItLW9rIiB+ICJHaWEgSG9sYnJvb2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIkctYSBIb2xici1vayIgfiAiR2lhIEhvbGJyb29rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJILXQtaWUtZCBTLXota2kiIH4gIkhhdGZpZWxkIFN1enVraSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSi14by0gQi1jLS1leSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSi14by0gQi1jay1leSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSi14b24gQi1jay1leSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSi14LW4gQi1jay0teSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSi14LW4gQi1ja2wteSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSi14LW4gQnVja2wteSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSi14LW4gQnVja2xleSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSmF4LW4gQnVja2xleSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSmF4b24gQi1jay1leSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiSmF4b24gQnVjay1leSIgfiAiSmF4b24gQnVja2xleSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiS25pZ2h0IFRyaXUtcGhhbnQiIH4gIktuaWdodCBUcml1bXBoYW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJNYWxpayBEZXN0LW55IiB+ICJNYWxpayBEZXN0aW55IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJNaS1hIC1lbW1hIiB+ICJNaXJhIExlbW1hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJNaXJhIC1lbW1hIiB+ICJNaXJhIExlbW1hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJQLXUtYSAtLXJuLXAiIH4gIlBhdWxhIFR1cm5pcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiUC11LWEgLS1ybmlwIiB+ICJQYXVsYSBUdXJuaXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIlBhdS1hIC11cm5pcCIgfiAiUGF1bGEgVHVybmlwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJQaS1jaGluZyAtYWMtLW5lIiB+ICJQaXRjaGluZyBNYWNoaW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJSLWctLSAtLWllLXItLS0iIH4gIlJpZ2J5IEZyaWVkcmljaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiVC1vbWEtIERyYWMtZW5hIiB+ICJUaG9tYXMgRHJhY2FlbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT0gIlRob21hLSBEcmFjLWVuYSIgfiAiVGhvbWFzIERyYWNhZW5hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyID09ICJUaG9tYXMgRHJhYy1lbmEiIH4gIlRob21hcyBEcmFjYWVuYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllciA9PSAiLS1uLS0tIENhcnZlLSIgfiAiU2FuZGllIENhcnZlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBwbGF5ZXIpKSAlPiUgCiAgZ3JvdXBfYnkodGltZXN0YW1wUE9TSVgsIHBvc2l0aW9uX2ZjdCwgcGxheWVyX25hbWUpICU+JSAKICBzdW1tYXJpc2UocGVyY2VudCA9IGVEZW5zaXR5L3RvdGFsLAogICAgICAgICAgICBhYnNfcGVyY2VudCA9IGFicyhlRGVuc2l0eSkvdG90YWwpICU+JSAKICBtdXRhdGUobG9nX3BlcmNlbnQgPSBjYXNlX3doZW4oYWJzX3BlcmNlbnQgPT0gMCB+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic19wZXJjZW50ID4gMCB+IGxvZyhhYnNfcGVyY2VudCkrNiksCiAgICAgICAgIHBsYXllcl9wb3NpdGlvbiA9IHBhc3RlMCgiICIsIGFzLmNoYXJhY3Rlcihwb3NpdGlvbl9mY3QpLCAiOiAiLCBwbGF5ZXJfbmFtZSkpICU+JSAKICAjIFBsb3QgYmVnaW5zIGhlcmUKICBnZ3Bsb3QoYWVzKHggPSB0aW1lc3RhbXBQT1NJWCwgCiAgICAgICAgICAgICB5ID0gcGVyY2VudCwKICAgICAgICAgICAgIGNvbG91ciA9IHBvc2l0aW9uX2ZjdCkpICsKICB0aGVtZV9idygpICsKICB2aXJpZGlzOjpzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIGRpc2NyZXRlID0gVFJVRSkgKwogIHZpcmlkaXM6OnNjYWxlX2NvbG91cl92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCBkaXNjcmV0ZSA9IFRSVUUpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogICMgTGF5ZXIgMSAoZm9yIGFuaW1hdGlvbikKICBnZW9tX3BvaW50KGFlcygjZ3JvdXAgPSBwbGF5ZXJfcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgc2l6ZSA9IHBlcmNlbnQpLAogICAgICAgICAgICAgcG9zaXRpb24gPSAic3RhY2siLAogICAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsCiAgICAgICAgICAgICBhbHBoYSA9IC41KSArCiAgIyBMYXllciAyICh0byBiZSBleGNsdWRlZCBmcm9tIGFuaW1hdGlvbidzIHNoYWRvdy90cmFjZSkKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGxheWVyX3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgc2l6ZSA9IGxvZ19wZXJjZW50KSwKICAgICAgICAgICAgc3RhdCA9ICJpZGVudGl0eSIsCiAgICAgICAgICAgIHBvc2l0aW9uID0gInN0YWNrIiwKICAgICAgICAgICAgY2hlY2tfb3ZlcmxhcCA9IEZBTFNFLCAKICAgICAgICAgICAgaGp1c3QgPSAwKSArCiAgZ2d0aXRsZSgiIikgLT4gcQpgYGAKCk5leHQsIGFuaW1hdGUgdGhlIHBsb3QsIHdoaWNoIHdpbGwgaW5pdGlhbGx5IGNvbXBpbGUgYXMgYSBnaWYsIGJ1dCBvbmx5IHdpdGggMTAwIGZyYW1lcyAoZm9yIG5vdykuCgpgYGB7ciBhbmltYXRlMiwgZXZhbD1GQUxTRX0KcSArIHRyYW5zaXRpb25fc3RhdGVzKHRpbWVzdGFtcFBPU0lYLAogICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9sZW5ndGggPSAxMCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlX2xlbmd0aCA9IDEpICsKICBlYXNlX2FlcygiY3ViaWMtaW4iKSArCiAgdmlld19mb2xsb3coZml4ZWRfeCA9IFRSVUUpICsKICBsYWJzKHRpdGxlID0gJ0lkb2wgQm9hcmQgYXQge2Nsb3Nlc3Rfc3RhdGV9JykgKyAKICBzaGFkb3dfdHJhaWwoZGlzdGFuY2UgPSAxLAogICAgICAgICAgICAgICBleGNsdWRlX2xheWVyID0gMikgKyAKICBzaGFkb3dfbWFyayhhbHBoYSA9IC4wNSwKICAgICAgICAgICAgICBleGNsdWRlX2xheWVyID0gMikgKwogIGVudGVyX2ZhZGUoKSArIGV4aXRfZmFkZSgpIC0+IHExCmBgYAoKRmluYWxseSwgcmVuZGVyIGl0IGFzIGEgdmlkZW8gYW5kIHNhdmUgaXQgKGFsdGhvdWdoIEkgc3RpbGwgbmVlZGVkIHRvIGNvbnZlcnQgdG8gLm00diB1c2luZyBbVkxDXShodHRwczovL3d3dy52aWRlb2xhbi5vcmcvKSBhbmQgdGhlbiB0cmFuc2NvZGUgdG8gLm1wNCB1c2luZyBbSGFuZEJyYWtlXShodHRwczovL2hhbmRicmFrZS5mci8pKS4KCmBgYHtyIHJlbmRlcjIsIGV2YWw9RkFMU0V9CmFuaW1hdGUocTEsIAogICAgICAgIG5mcmFtZXMgPSA2MDAwLAogICAgICAgIGZwcyA9IDMwLAogICAgICAgIHJlbmRlcmVyID0gYXZfcmVuZGVyZXIoKSwKICAgICAgICBkZXRhaWwgPSAzLAogICAgICAgIHdpZHRoID0gMTkyMCwKICAgICAgICBoZWlnaHQgPSAxMDgwKQojYW5pbV9zYXZlKCIyMDIxMDcyNS1iaWdfdmlkIikKYGBgCgpBbmQsIGlmIGFsbCBnb2VzIHdlbGwsIGFuZCB5b3UgaGF2ZSBsb3RzIG9mIHRpbWUgYW5kIHN1ZmZpY2llbnQgY29tcHV0aW5nIHBvd2VyLCB5b3UgZ2V0IHNvbWV0aGluZyBsaWtlIHRoaXM6Cgo8dmlkZW8gd2lkdGg9IjkwMCIgY29udHJvbHM+CiAgPHNvdXJjZSBzcmM9IjIwMjEwNzI1LWJpZ192aWQubXA0IiB0eXBlPSJ2aWRlby9tcDQiPgo8L3ZpZGVvPgo=